package com.miao.config;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.MediaType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Configuration
public class JsonHttpMessageConverterConfig {

    /**
     * 配置并返回一个主要的HttpMessageConverters，用于Spring MVC中的HTTP消息转换
     * 该方法主要目的是为了整合FastJson作为Spring Boot项目中的JSON处理工具
     *
     * @return HttpMessageConverters 包含配置好的FastJsonHttpMessageConverter
     */
    @Bean
    @Primary
    public HttpMessageConverters fastJsonHttpMessageConverters(){
        // 创建一个FastJsonHttpMessageConverter实例，用于JSON格式数据的HTTP消息转换
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        // 创建并配置FastJson的全局配置
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        // 设置日期格式，使日期类型的数据在序列化时遵循该格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

        // 配置一系列的序列化特性，以定制JSON数据的序列化行为
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,                 //标准格式化输出
                SerializerFeature.WriteNullStringAsEmpty,       //不去掉字段null字段 自动转成空字符串
                SerializerFeature.WriteNullListAsEmpty,         //不去掉空list字段
                SerializerFeature.WriteMapNullValue,            //不去掉map空字段
                SerializerFeature.MapSortField,                 //map字段排序
                SerializerFeature.DisableCircularReferenceDetect    //去掉循环引用检测
        );

        // 将配置好的FastJsonConfig应用到FastJsonHttpMessageConverter中
        fastConverter.setFastJsonConfig(fastJsonConfig);

        // 如果使用feign进行微服务间的接口调用，则需要加上该配置
        // 设置支持的媒体类型为APPLICATION_JSON，确保JSON数据能被正确处理
        fastConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));

        // 返回配置好的HttpMessageConverter，供Spring MVC使用
        return new HttpMessageConverters(fastConverter);
    }

    //处理循环引用演示案例
    public static void main(String[] args){
        List<Object> list = new ArrayList<>();
        Object o = new Object();
        list.add(o);
        list.add(o);
        System.out.println(list.size());
        System.out.println(JSONObject.toJSONString(list));
        System.out.println(JSONObject.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect));
    }
}
